50. new & delete

operator new & operator delete 수정
- 잘못된 힙 사용을 탑지
요구되는 크기보다 약간 더 큰 메모리를 할당해서 앞뒤로 오버런/언더런 탐지용 바이트 패턴을 사용해서,
잘못된 힙 사용을 사전에 탐지할 수 있다.
- 효율을 향상
컴파일러가 기본적으로 제공하는 operator new와 operator delete는 대중적이고 온건지향 스타일이다
개발자가 자신의 프로그램이 동적 메모리를 사용하는 성향에 따라 메모리를 할당하고 싶은 경우,
operator new와 opearator delete를 수정해서 사용할 수 있다.
- 동적 메모리 사용에 대한 통계 정보(데이터)를 수집하기 위해

보안을 위해 메모리를 사용 후, 해제할 때 0으로 메모리를 정렬하도록 operator delete를 수정할 수 있다.
오버런/언더런 탐지를 위한 operator new
new-handler 호출 과정은 생략함
static const int signature=0xDEADBEEF;
typedef unsigned char Byte;
void* operator new(std::size_t size) throw(stsd::bad_alloc){
using namespace std;
size_t realSize=size+2*sizeof(int); // int
void* pMem=malloc(realSize);
if(!pMem) throw bad_alloc();
*(static_cast<int*>(pMem))=signature;
*(reinterpret_cast<int*>(static_cast<Byte*>(pMem)+realSize-sizeof(int)))=signature;
return static_cast<Byte*>(pMem)+sizeof(int);
}
아키텍처에 따라서 바이트 정렬(alignment) 단위가 다르다.
(int(4바이트)에 주소를 맞추어 정렬하거나 double(8바이트)에 주소를 맞춰서 저장)

C++의 operator new는 적절히 바이트 정렬을 만족하는 포인터를 반환해 줄 것을 요구한다.
표준 malloc 함수는 바이트 정렬을 따르도록 설계되어 있지만, 위와 같이 malloc을 수정해서 반환하는 경우
바이트 정렬을 고려해서 포인터 주소를 반환해야 한다.
(만일 double에 주소를 맞춰서 사용하는 아키텍처에서 위와 같이 int만큼 어긋난 주소를 반환하면
실행속도가 느려질 수 있으며, 심하면 프로그램이 다운될 수 있음)
boost-Pool 라이브러리
풀(pool)라이브러리가 제공하는 메모리 할당자는 사용자 정의 메모리 관리 루틴으로 도움을 줄 수 있도록
튜닝되어 있다.
(이식성, 바이트 정렬 문제, 스레드 안정성 등을 고려하여 구현되어 있음)

TR1에서는 타입에 따라 바이트 정렬 요구사항을 알려 주는 기능을 지원한다.